home *** CD-ROM | disk | FTP | other *** search
- unit DMCalendar;
- {$DEFINE INTERFACE}
- interface
- uses
- Windows, SysUtils, Classes, Controls, Forms,
- Calendar, DB, DBCtrls;
-
- {$IFDEF INTERFACE}
- type
- IDataAware = interface
- ['{FFC47B41-0D51-11D5-8131-00104BF89DAD}']
- function GetDataSource: TDataSource;
- procedure SetDataSource(const Value: TDataSource);
- function GetDataField: string;
- procedure SetDataField(const Value: string);
- property DataSource: TDataSource read GetDataSource write SetDataSource;
- property DataField: String read GetDataField write SetDataField;
- end;
- {$ENDIF}
-
- type
- TDMCalendar = class(TCalendar {$IFDEF INTERFACE}, IDataAware{$ENDIF})
- private
- FFieldDataLink: TFieldDataLink;
- function GetDataField: String;
- function GetDataSource: TDataSource;
- procedure SetDataField(const Value: String);
- procedure SetDataSource(const Value: TDataSource);
- { Private declarations }
- protected
- { Protected declarations }
- procedure DataChange(Sender: TObject); // date changed in table
- procedure Change; override; // date changed by user in calendar
- procedure UpdateData(Sender: TObject); // change data in table
- procedure CmExit(var Message: TCmExit); message CM_Exit;
- public
- { Public declarations }
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- published
- { Published declarations }
- property DataSource: TDataSource read GetDataSource write SetDataSource;
- property DataField: String read GetDataField write SetDataField;
- end;
-
- procedure Register;
-
- implementation
-
- procedure Register;
- begin
- RegisterComponents('DrBob42', [TDMCalendar]);
- end;
-
- { TDMCalendar }
-
- constructor TDMCalendar.Create(AOwner: TComponent);
- begin
- inherited;
- FFieldDataLink := TFieldDataLink.Create;
- FFieldDataLink.OnDataChange := DataChange;
- FFieldDataLink.OnUpdateData := UpdateData
- end;
-
- destructor TDMCalendar.Destroy;
- begin
- FFieldDataLink.Free;
- FFieldDataLink := nil;
- inherited
- end;
-
- function TDMCalendar.GetDataField: String;
- begin
- Result := FFieldDataLink.FieldName
- end;
-
- function TDMCalendar.GetDataSource: TDataSource;
- begin
- Result := FFieldDataLink.DataSource
- end;
-
- procedure TDMCalendar.SetDataField(const Value: String);
- begin
- FFieldDataLink.FieldName := Value
- end;
-
- procedure TDMCalendar.SetDataSource(const Value: TDataSource);
- begin
- FFieldDataLink.DataSource := Value
- end;
-
- procedure TDMCalendar.DataChange(Sender: TObject);
- begin
- if Assigned(FFieldDataLink.Field) then
- if (FFieldDataLink.Field IS TDateField) or
- (FFieldDataLink.Field IS TDateTimeField) then
- CalendarDate := FFieldDataLink.Field.AsDateTime
- end;
-
- procedure TDMCalendar.Change;
- begin
- FFieldDataLink.Modified;
- inherited
- end;
-
- procedure TDMCalendar.UpdateData(Sender: TObject);
- begin
- if Assigned(FFieldDataLink.Field) then
- if (FFieldDataLink.Field IS TDateField) or
- (FFieldDataLink.Field IS TDateTimeField) then
- FFieldDataLink.Field.AsDateTime := CalendarDate
- end;
-
- procedure TDMCalendar.CmExit(var Message: TCmExit);
- begin
- try
- FFieldDataLink.UpdateRecord
- except
- SetFocus;
- raise // re-raise exception
- end;
- inherited
- end;
-
- end.
-